import sys
import pyautogui  # 用于全局按键模拟（关键修复点）
from PySide6.QtWidgets import (QApplication, QWidget, QPushButton, QVBoxLayout, 
                               QHBoxLayout, QLabel, QToolTip)
from PySide6.QtCore import Qt, QTimer, QPoint
from PySide6.QtGui import QFont, QFontDatabase

class FloatCopyPasteTool(QWidget):
    def __init__(self):
        super().__init__()
        # 确保中文显示正常
        self.init_font()
        
        # 窗口基础配置
        self.setWindowTitle("悬浮复制粘贴助手")
        self.setFixedSize(200, 200)  # 固定尺寸200×200
        self.setWindowFlags(
            Qt.FramelessWindowHint |  # 无边框
            Qt.WindowStaysOnTopHint |  # 置顶显示
            Qt.Tool  # 工具窗口（无任务栏图标）
        )
        self.setAttribute(Qt.WA_TranslucentBackground)  # 透明背景
        self.move_to_top_right()  # 初始位置：右上角
        
        # 倒计时配置（1.5秒=1500ms，分3步更新）
        self.countdown_total = 1500  # 总时长（毫秒）
        self.countdown_step = 500    # 每步间隔（毫秒）
        self.countdown_steps = self.countdown_total // self.countdown_step  # 3步
        
        # 状态变量
        self.dragging = False
        self.drag_start_pos = QPoint()
        self.copy_remaining = self.countdown_steps
        self.paste_remaining = self.countdown_steps
        
        # 定时器
        self.copy_timer = QTimer(self)
        self.paste_timer = QTimer(self)
        self.copy_timer.setInterval(self.countdown_step)
        self.paste_timer.setInterval(self.countdown_step)
        
        # 初始化UI
        self.init_ui()
        # 绑定信号槽（关键修复：按钮单独绑定事件）
        self.bind_events()

    def init_font(self):
        """确保中文正常显示"""
        font_families = QFontDatabase.families()
        if "SimHei" in font_families:
            self.font = QFont("SimHei", 10)
        else:
            self.font = QFont("WenQuanYi Micro Hei", 10)  # 备选字体

    def init_ui(self):
        # 主布局（垂直布局）
        main_layout = QVBoxLayout(self)
        main_layout.setContentsMargins(5, 5, 5, 5)
        main_layout.setSpacing(10)
        
        # 标题标签
        title_label = QLabel("复制粘贴助手", self)
        title_label.setAlignment(Qt.AlignCenter)
        title_font = QFont(self.font.family(), 12, QFont.Bold)
        title_label.setFont(title_font)
        title_label.setStyleSheet("color: #333;")
        main_layout.addWidget(title_label)
        
        # 按钮容器（白色半透明背景）
        btn_container = QWidget(self)
        btn_container.setStyleSheet("background-color: rgba(255, 255, 255, 0.9); border-radius: 8px;")
        btn_layout = QHBoxLayout(btn_container)
        btn_layout.setContentsMargins(5, 5, 5, 5)
        btn_layout.setSpacing(5)
        
        # 左侧复制按钮
        self.copy_btn = QPushButton("复制\n(Ctrl+C)", self)
        self.init_button_style(
            self.copy_btn, 
            normal_color="#4CAF50",  # 绿色（默认）
            hover_color="#388E3C"    # 深绿（悬浮/点击）
        )
        btn_layout.addWidget(self.copy_btn)
        
        # 右侧粘贴按钮
        self.paste_btn = QPushButton("粘贴\n(Ctrl+V)", self)
        self.init_button_style(
            self.paste_btn, 
            normal_color="#2196F3",  # 蓝色（默认）
            hover_color="#1976D2"    # 深蓝（悬浮/点击）
        )
        btn_layout.addWidget(self.paste_btn)
        
        main_layout.addWidget(btn_container)
        main_layout.addStretch()

    def init_button_style(self, btn, normal_color, hover_color):
        """初始化按钮样式"""
        btn.setFont(QFont(self.font.family(), 10, QFont.Bold))  # 字体
        btn.setMinimumHeight(80)  # 按钮高度
        btn.setStyleSheet(f"""
            QPushButton {{
                background-color: {normal_color};
                color: white;
                border-radius: 6px;
                padding: 5px;
            }}
            QPushButton:hover {{
                background-color: {hover_color};  /* 悬浮时变色 */
            }}
            QPushButton:pressed {{
                background-color: {hover_color};  /* 点击时变色 */
            }}
        """)

    def move_to_top_right(self):
        """将窗口移动到桌面右上角"""
        screen_geometry = QApplication.primaryScreen().geometry()
        x = screen_geometry.width() - self.width() - 20  # 右侧留20px
        y = 50  # 顶部留50px
        self.move(x, y)

    def bind_events(self):
        """绑定信号和事件（关键修复：按钮单独绑定进入/离开事件）"""
        # 定时器信号
        self.copy_timer.timeout.connect(self.update_copy_countdown)
        self.paste_timer.timeout.connect(self.update_paste_countdown)
        
        # 按钮点击事件
        self.copy_btn.clicked.connect(self.trigger_copy)
        self.paste_btn.clicked.connect(self.trigger_paste)
        
        # 关键修复：给按钮单独绑定鼠标进入/离开事件（替代窗口级事件）
        self.copy_btn.enterEvent = self.on_copy_enter  # 鼠标进入复制按钮
        self.copy_btn.leaveEvent = self.on_copy_leave  # 鼠标离开复制按钮
        self.paste_btn.enterEvent = self.on_paste_enter  # 鼠标进入粘贴按钮
        self.paste_btn.leaveEvent = self.on_paste_leave  # 鼠标离开粘贴按钮

    # 复制按钮事件（关键修复：单独检测按钮的鼠标进入）
    def on_copy_enter(self, event):
        self.copy_remaining = self.countdown_steps
        self.update_button_text(self.copy_btn, "复制")
        self.copy_timer.start()
        super().enterEvent(event)  # 保留默认行为

    # 复制按钮鼠标离开
    def on_copy_leave(self, event):
        self.copy_timer.stop()
        self.copy_btn.setText("复制\n(Ctrl+C)")
        super().leaveEvent(event)

    # 粘贴按钮事件（关键修复：单独检测按钮的鼠标进入）
    def on_paste_enter(self, event):
        self.paste_remaining = self.countdown_steps
        self.update_button_text(self.paste_btn, "粘贴")
        self.paste_timer.start()
        super().enterEvent(event)

    # 粘贴按钮鼠标离开
    def on_paste_leave(self, event):
        self.paste_timer.stop()
        self.paste_btn.setText("粘贴\n(Ctrl+V)")
        super().leaveEvent(event)

    def update_copy_countdown(self):
        """更新复制按钮倒计时"""
        self.copy_remaining -= 1
        if self.copy_remaining <= 0:
            self.copy_timer.stop()
            self.trigger_copy()
            self.copy_btn.setText("复制\n(Ctrl+C)")
        else:
            self.update_button_text(self.copy_btn, "复制")

    def update_paste_countdown(self):
        """更新粘贴按钮倒计时"""
        self.paste_remaining -= 1
        if self.paste_remaining <= 0:
            self.paste_timer.stop()
            self.trigger_paste()
            self.paste_btn.setText("粘贴\n(Ctrl+V)")
        else:
            self.update_button_text(self.paste_btn, "粘贴")

    def update_button_text(self, btn, action):
        """更新按钮文本，显示剩余倒计时"""
        remaining_sec = (self.copy_remaining if btn == self.copy_btn else self.paste_remaining) * self.countdown_step / 1000
        btn.setText(f"{action}\n{remaining_sec:.1f}s")

    def trigger_copy(self):
        """触发复制操作（关键修复：用pyautogui模拟全局按键）"""
        try:
            pyautogui.hotkey('ctrl', 'c')  # 全局模拟Ctrl+C，不受焦点影响
            self.show_tip("复制成功")
        except Exception as e:
            self.show_tip(f"复制失败: {str(e)}")

    def trigger_paste(self):
        """触发粘贴操作（关键修复：用pyautogui模拟全局按键）"""
        try:
            pyautogui.hotkey('ctrl', 'v')  # 全局模拟Ctrl+V
            self.show_tip("粘贴成功")
        except Exception as e:
            self.show_tip(f"粘贴失败: {str(e)}")

    def show_tip(self, text):
        """显示临时提示信息"""
        tip_pos = self.mapToGlobal(QPoint(self.width()//2, self.height()))  # 窗口下方居中
        QToolTip.showText(tip_pos, text, self, None, 1500)  # 1.5秒后消失

    # 窗口拖动功能
    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.dragging = True
            self.drag_start_pos = event.globalPos() - self.frameGeometry().topLeft()
            event.accept()
        elif event.button() == Qt.RightButton:
            # 右键点击关闭窗口
            self.close()

    def mouseMoveEvent(self, event):
        if self.dragging and event.buttons() & Qt.LeftButton:
            self.move(event.globalPos() - self.drag_start_pos)
            event.accept()

    def mouseReleaseEvent(self, event):
        self.dragging = False

if __name__ == "__main__":
    app = QApplication(sys.argv)
    tool = FloatCopyPasteTool()
    tool.show()
    sys.exit(app.exec())